package com.yb.chapter1;

import java.util.LinkedList;
import java.util.Queue;

/**
 * 描述：要求实现猫狗队列数据结构，要求如下：
 *
 * 要求：
 *  1、用户可以调用add方法将cat类或者Dog类的实例放入队列中；
 *  2、用户可以调用pollAll方法，将队列中所有的实例按照进队列的先后顺序依次弹出
 *  3、用户可以调用pollDog方法，将队列中Dog实例按照进队列的先后顺序依次弹出
 *  4、用户可以调用pollCat方法，将队列中Cat实例按照进队列的先后顺序依次弹出
 *  5、用户可以调用 isEmpty方法，检查队列中是否有cat 或者 dog的实例
 *  6、用户可以调用 isDogEmpty 方法，检查队列中是否有dog的实例
 *  7、用户可以调用 isCatEmpty 方法，检查队列中是否有cat的实例
 * 思路：
 *   1、都放在相同的队列中实现,较麻烦
 *   2、放在两个队列中实现，可以利用现有的数据结构实现
 * @author yb
 * @date 2022/2/11 15:27
 */
public class CatDogQueue {

    Queue<Node> catQueue = null;
    Queue<Node> dogQueue = null;
    int order = 0;

    public CatDogQueue(){
        catQueue = new LinkedList<Node>();
        dogQueue = new LinkedList<Node>();
    }

    public void add(Pet pet){
        final Node node = new Node(pet, order);
        if(pet instanceof Dog){
            dogQueue.add(node);
        }else{
            catQueue.add(node);
        }
        order++;
    }

    public void pollAll(){
        while(!dogQueue.isEmpty() || !catQueue.isEmpty()){
            if(!dogQueue.isEmpty() && !catQueue.isEmpty()){
                final Node dog = dogQueue.peek();
                final Node cat = catQueue.peek();
                if(dog.order < cat.order){
                    System.out.println("移除一个元素" + dogQueue.poll().data);
                }else{
                    System.out.println("移除一个元素" + catQueue.poll().data);
                }
            }else if(!dogQueue.isEmpty()){
                System.out.println("移除一个元素" + dogQueue.poll().data);
            }else{
                System.out.println("移除一个元素" + catQueue.poll().data);
            }
        }
    }

    public void pollDog(){
        while(!dogQueue.isEmpty()){
            System.out.println("移除一条狗" + dogQueue.poll().data);
        }
    }

    public void pollCat(){
        while(!catQueue.isEmpty()){
            System.out.println("移除一只猫" + catQueue.poll().data);
        }
    }

    public boolean isEmpty(){
        return catQueue.isEmpty() && dogQueue.isEmpty();
    }

    public boolean isDogEmpty(){
       return dogQueue.isEmpty();
    }

    public boolean isCatEmpty(){
        return catQueue.isEmpty();
    }

    static class Node{
        Pet data;
        int order;
        public Node(Pet data,int order){
            this.data = data;
            this.order = order;
        }
    }


    public static void main(String[] args) {
        Dog dog = new Dog("dog1");
        Cat cat = new Cat("cat1");
        Dog dog2 = new Dog("dog2");
        Cat cat2 = new Cat("cat2");
        CatDogQueue queue = new CatDogQueue();
        queue.add(dog);
        queue.add(cat);
        queue.add(dog2);
        queue.add(cat2);

        System.out.println("isEmpty=>"+queue.isEmpty());
        System.out.println("isCatEmpty=>"+queue.isCatEmpty());
        System.out.println("isDogEmpty=>"+queue.isDogEmpty());
        System.out.println("移除所有的猫=>");
        queue.pollCat();
        System.out.println("移除猫之后isCatEmpty=>"+queue.isCatEmpty());
        System.out.println("移除所有的狗=>");
        queue.pollDog();
        System.out.println("移除所有的狗后isDogEmpty=>"+queue.isDogEmpty());

        queue.add(dog);
        queue.add(cat);
        queue.add(dog2);
        queue.add(cat2);

        queue.pollAll();

    }

}
